package com.encryptdemo.encrypt.util;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AESUtil {
    private static final String SECRET_KEY = "1234567890123456"; // 16字节密钥

    /**
     * 使用 AES 对数据进行加密
     *
     * @param data 要加密的字符串
     * @param key  加密的密钥
     * @return 加密后的 Base64 字符串
     */
    public static String encrypt(String data, String key) {
        if (StrUtil.isBlank(key)) {
            throw new IllegalArgumentException("AES需要传入秘钥信息");
        }
        // aes算法的秘钥要求是16位、24位、32位
        int[] array = {16, 24, 32};
        if (!ArrayUtil.contains(array, key.length())) {
            throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位");
        }
        // 创建 AES 加密对象
        AES aes = SecureUtil.aes(SECRET_KEY.getBytes());
        // 执行加密并返回 Base64 字符串
        return aes.encryptBase64(data);
    }

    /**
     * 使用 AES 对数据进行解密
     *
     * @param encryptedData 已加密的 Base64 字符串
     * @param key  加密的密钥
     * @return 解密后的原始字符串
     */
    public static String decrypt(String encryptedData,String key) {
        if (StrUtil.isBlank(key)) {
            throw new IllegalArgumentException("AES需要传入秘钥信息");
        }
        // aes算法的秘钥要求是16位、24位、32位
        int[] array = {16, 24, 32};
        if (!ArrayUtil.contains(array, key.length())) {
            throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位");
        }

        // 创建 AES 解密对象
        AES aes = SecureUtil.aes(SECRET_KEY.getBytes());
        // 执行解密
        return aes.decryptStr(encryptedData);
    }

    public static String decryptByAes(String data, String password) {
        if (StrUtil.isBlank(password)) {
            throw new IllegalArgumentException("AES需要传入秘钥信息");
        }
        // aes算法的秘钥要求是16位、24位、32位
        int[] array = {16, 24, 32};
        if (!ArrayUtil.contains(array, password.length())) {
            throw new IllegalArgumentException("AES秘钥长度要求为16位、24位、32位");
        }
        return SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8);
    }
}
